library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.2     ✔ tibble    3.3.0
## ✔ lubridate 1.9.4     ✔ tidyr     1.3.1
## ✔ purrr     1.1.0     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(p8105.datasets)

library(plotly)
## 
## Attaching package: 'plotly'
## 
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## 
## The following object is masked from 'package:stats':
## 
##     filter
## 
## The following object is masked from 'package:graphics':
## 
##     layout

Let’s load the Airbnb dataset

data("nyc_airbnb")

nyc_airbnb = 
  nyc_airbnb |> 
  mutate(
    rating = review_scores_location / 2
  ) |> 
  select(
    neighbourhood_group, neighbourhood, rating,
    price, room_type, lat, long
  ) |> 
  filter(
    neighbourhood_group == "Manhattan",
    room_type == "Entire home/apt",
    price <= 500,
    price >= 100
  )

Interactive scatterplot

nyc_airbnb |> 
  mutate(
    label = str_c("Price : $", price, "\nRating :", rating)
  ) |> 
   plot_ly(
    x = ~lat, y = ~long, color = ~price,
    type = "scatter", mode = "markers", alpha = 0.5
  )

Let’s make a boxplot

nyc_airbnb |>
  mutate(
    neighbourhood = fct_reorder(neighbourhood, price)
  ) |> 
  plot_ly(
    x = ~neighbourhood, y = ~price, color = ~neighbourhood,
    type = "box", colors = "viridis"
  )

barcharts

nyc_airbnb |> 
  count(neighbourhood) |> 
  mutate(
    neighbourhood = fct_reorder(neighbourhood, n) 
  ) |> 
  plot_ly(
    x = ~neighbourhood, y = ~n,
    type = "bar")